package com.project.file.tool;

import cn.hutool.core.util.StrUtil;
import com.project.bean.file.SaveFileOutDTO;
import com.project.core.util.CommonUtil;
import com.project.file.helper.FilePropertiesHelper;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.time.LocalDate;
import java.util.Objects;

/**
 * @author mengxj
 */
public abstract class BaseFile {

    private static final String POINT = ".";

    /**
     * 删除文件
     * @param bucket 根目录
     * @param objectName 全名
     * @return 是否删除成功
     */
    public abstract boolean removeFile(String bucket, String objectName);

    /**
     * 保存文件
     * @param fileName 文件名
     * @param bucket 根目录
     * @param is 输入流
     * @param suffix 后缀
     * @return 文件信息
     * @throws Exception 异常
     */
    public abstract SaveFileOutDTO saveFile(String fileName, String bucket, InputStream is, String suffix) throws Exception;

    /**
     * 下载文件
     * @param bucket 根目录
     * @param objectName 全名
     * @param fileName 文件名
     */
    public abstract void download(String bucket, String objectName, String fileName);

    /**
     * 保存文件
     * @param file 文件
     * @return 文件信息
     */
    public SaveFileOutDTO saveFile(MultipartFile file){
        if(Objects.isNull(file)){
            CommonUtil.throwException("参数 file 不存在！");
        }
        String fileName = file.getOriginalFilename();
        int index = 0;
        if(StrUtil.isEmpty(fileName) || (index = fileName.indexOf(POINT)) == -1){
            CommonUtil.throwException(String.format("文件名非法: %s", fileName));
        }
        assert fileName != null;
        String suffix = fileName.substring(index + 1);
        String bucket = FilePropertiesHelper.bucket();
        try (InputStream is = file.getInputStream()) {
            return this.saveFile(fileName, bucket, is, suffix);
        } catch (Exception e) {
            String msg = String.format("保存文件失败! %s: %s", e.getClass(), e.getMessage());
            CommonUtil.throwException(msg, e);
        }
        return null;
    }

    /**
     * 获取临时文件名
     * @param suffix 文件后缀
     * @param fileName 文件名
     * @return 临时文件名
     */
    protected String getObjectName(String suffix, String fileName){
        return String.format("%s/%s/%s/%s", LocalDate.now().toString(), suffix, System.currentTimeMillis(), fileName);
    }
}
